首页 > 试题广场 >

删除多余的字符得到字典序最小的字符串

[编程题]删除多余的字符得到字典序最小的字符串
  • 热度指数:1762 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并且让最终结果字符串字典序最小。

输入描述:
输入包含一行字符串,代表str


输出描述:
输出一行,代表删除后的字符串。
示例1

输入

acbc

输出

abc
示例2

输入

dbcacbca

输出

dabc

备注:
时间复杂度,额外空间复杂度
# 寻找字符串中字典序最小的字符
def getChar(string):
    string_length = len(string)
    if string_length == 0:
        return ''
    else:
        result = string[0]
        for i in range(1, string_length):
            if string[i] < result:
                result = string[i]
    return result


# 构建字符串的词频表
def getCharCount(string):
    result = {}
    for i in string:
        if i not in result.keys():
            result[i] = 1
        else:
            result[i] += 1
    return result


# 删除掉字符串中某个指定的字符
def deleteChar(string, char):
    result = ''
    for i in string:
        if i == char:
            continue
        else:
            result += i
    return str(result)


# 输入字符串
string = input()
# 获取字符串词频分布表
char_count = getCharCount(string)
char_count_length = len(char_count.keys())
result = []
while len(result) != char_count_length:
    # 当前遍历位置
    i = 0
    # 当前字符串长度
    string_length = len(string)
    # 遍历字符串
    for i in range(string_length):
        char_count[string[i]] -= 1
        # 需要进行选择的位置
        if char_count[string[i]] == 0:
            break
    # 如果当前位置是字符串最后一个位置
    if i + 1 == string_length:
        result_char = getChar(string)
        result.append(result_char)
        string = deleteChar(string, result_char)
    else:
        result_char = getChar(string[:i + 1])
        result.append(result_char)
        string = deleteChar(string[i:], result_char)

    # 重新构建词频表
    char_count = getCharCount(string)
print(''.join(result))
贪心思想
发表于 2022-04-03 11:10:09 回复(0)